package com.example.basic01;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

/**
 * test
 */
@Slf4j
public class Basic01 {
    @Test
    public void test() {
        log.info("3 << 4:{}", 3 << 4);//  3*2^4
        double d = 2.3;
        /*
         * float f=3.4;是否正确
         * 不正确。3.4 是双精度数，将双精度型（double）赋值给浮点型（float）属于下转型（down-casting，也称为窄化）
         * 会造成精度损失，因此需要强制类型转换float f =(float)3.4; 或者写成 float f =3.4F;。
         */
//        float f = d;
        // 3*0.1==0.3返回值是什么 精度问题
        log.info("ret:{}", 3 * 0.1 == 0.3);
        /*
         * a=a+b与a+=b有什么区别吗?
         * +=操作符会进行隐式自动类型转换，此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型，而a=a+b则不会自动进行类型转换。
         */
        byte b1 = 12;
        byte b2 = 13;
//        byte ret = b1 + b2;  // 不可以
        b1 += b2; // 可以 自动类型转换
        /*
         * short s1= 1; s1 = s1 + 1; 该段代码是否有错,有的话怎么改？
         * 有错误，short类型在进行运算时会自动提升为int类型，也就是说s1+1的运算结果是int类型。
         */
    }

    /**
     * 测试注释
     * {@link Animal}
     * @link {https://www.baidu.com/}
     */
    @Test
    public void test01() {
        Integer a = 11;
        Integer b = 13;
        /*
        a:1011
        b:1101
        ------
        |:1111
        &:1001
         */
        log.info("a|b:{}", a | b);
        // 就看有没有这个因子
        log.info("a|b:{}", 12 | 4);
        log.info("a&b:{}", a & b);
    }

    @Test
    public void aboutFinal() {
        /*
        final:
        1.被final修饰的类不可以被继承
        2.被final修饰的方法不可以被重写
        3.被final修饰的变量不可以被改变。如果修饰引用，那么表示引用不可变，引用指向的内容可变。
        4.被final修饰的方法，JVM会尝试将其内联，以提高运行效率
        5.被final修饰的常量，在编译阶段会存入常量池中。
         */

        /*
        final finally finalize区别
        1.final可以修饰类、变量、方法，修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表
        示该变量是一个常量不能被重新赋值。
        2.finally一般作用在try-catch代码块中，在处理异常的时候，通常我们将一定要执行的代码方法finally代码块
        中，表示不管是否出现异常，该代码块都会执行，一般用来存放一些关闭资源的代码。
        3.finalize是一个方法，属于Object类的一个方法，而Object类是所有类的父类，该方法一般由垃圾回收器来调
        用，当我们调用System.gc() 方法的时候，由垃圾回收器调用finalize()，回收垃圾，一个对象是否可回收的
        最后判断。
         */

        /*
        【在Java中定义一个不做事且没有参数的构造方法的作用】
        Java程序在执行子类的构造方法之前，如果没有用super()来调用父类特定的构造方法，则会调用父类中“没有参数的构造方法”。
        因此，如果父类中只定义了有参数的构造方法，而在子类的构造方法中又没有用super()来调用父类中特定的构造方法，
        则编译时将发生错误，因为Java程序在父类中找不到没有参数的构造方法可供执行。
        解决办法是在父类里加上一个不做事且没有参数的构造方法。
         */
    }
}
